スクレイピング - 目的の要素を調べて取得
https://gyazo.com/0bbc4aad3bd1bb72c3b992162f03b10a
ウェブのページは HTML で書かれています。スクレイピングする場合はこの HTML の中から目的の要素を特定して抜き出す必要があります。
HTML の中の要素を調べる場合はウェブブラウザの開発者用ツールを使用すると便利です。ここでは Google Chrome(バージョン: 70.0.3538.110)を使用して HTML 要素を調べ、BeautifulSoup で抜き出す手順を説明します。
ウェブブラウザを使って目的の HTML 要素を調べる
まず Chrome を起動して右上のメニューから「その他のツール」→「デベロッパーツール」を選択して開発者用ツールを起動します(F12 キー、または Ctrl+Shift+I でも起動できます)。
https://gyazo.com/993d8b1355fd308054786f9e911be338
開発者用ツールを起動したら下図のような左端にあるカーソルのアイコンをクリックします。
https://gyazo.com/1356c9b156645a7d6541cf3490c91d47
これで要素を調べる準備ができました。そのまま表示されているページの適当な文字の上にマウスカーソルを移動しクリックすると、対応する要素の HTML のソースコードが開発者用ツールの「Elements」タブに表示されます。
次の図では Yahoo! ニュースのページで「IT・科学」の1件目のニュースのラベルをマウスで選択しています。
https://gyazo.com/7ed50c71dcf3ab86b4b11dfff453d623
対応する HTML のソースコードは下図のようになっています。ここから「topics」クラスのリスト(<ul>要素)のリスト項目(<li>要素)の中にあるリンク(<a>要素)のテキストを取得すれば、ニュースの見出しを抜き出せそうなことがわかります。
https://gyazo.com/f3f39ba9f1ed88a7916ebca96151b11b
スクレイピング用プログラムの作成
以上の情報からスクレイピング用のプログラムを作成すると以下のようになります。
code:scraping2.py
import requests
import bs4
# ページの取得
# 変更するポイント
content = requests.get(url)
# 情報の抜き出し
soup = bs4.BeautifulSoup(content.content, "lxml")
# 変更ポイント
elements = soup.select("section.yjnSub_section div#accr .yjnSub_list_headline")
for e in elements:
# 取得した見出しを表示
print(">" + e.getText())
これを実行すると例えば次のように表示されます。
code:shell
「今年になって話したのは、先生が初めてです」…高齢男性に深刻な会話不足 夫婦喧嘩が寿命を延ばす!?
痛み止めの麻薬は怖くない?=医療現場では日常的に処方
総務省が「5G」電波の割り当てを決定 ソフトバンクと楽天は“追加条件”あり
「私、失敗しないので」 ドクターX・大門未知子はなぜ恋愛しないのか
復活した「iPad mini」がスマホ選びの新基準になり得る理由
CSSセレクター
ここで重要なのが BeautifulSoup オブジェクト(例では変数 soup に入っています)の select() メソッドです。
select() メソッドでは CSS セレクターと同じ文法で HTML 要素を選択して取り出すことができます。ここではよく使うものだけを抜粋して紹介します。
table:cssセレクター
Pythonのコード 意味 取得要素の例
soup.select("div") div 要素を取得 <div>~</div>
soup.select("#date") id 属性 date の要素を取得 <div id="date">~</div>や<a id="date">~</a>など
soup.select(".date") クラス名 date の要素を取得 <div class="date">~</div> や <a class="date">~</a> など
soup.select("div a") div の下の全ての a 要素を取得 <div><a>~</a></div>
soup.select("inputtype=button") type 属性が button である input 要素を取得 <input type="button">~</input>